<?php
/**
 * JT Library Object Class
 *
 * @version 1.0
 * @author Alexey N. Brin (userxp@joomlaportal.ru)
 * @filename object.php
 * @package JT.Library
 * @copyright (C) 2008-2009 by joomlatune.ru
 * @license GNU/GPL: http://www.gnu.org/copyleft/gpl.html
 * 
 * If you fork this to create your own project, 
 * please make a reference to JT.Library someplace in your code 
 * and provide a link to http://www.joomlatune.ru
 *
 */

// grabbed :) from Joomla 1.5.11
// modified by UserXP


/**
 * @version		$Id: object.php 10707 2008-08-21 09:52:47Z eddieajau $
 * @package		Joomla.Framework
 * @subpackage	Base
 * @copyright	Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * See COPYRIGHT.php for copyright notices and details.
 */

/**
 * Object class, allowing __construct in PHP4.
 *
 * @package		
 * @subpackage	Base
 */
if( !class_exists( 'JObject' ) ) {
	class JObject
	{
		/**
		 * An array of errors
		 *
		 * @var		array of error messages or JExceptions objects
		 * @access	protected
		 */
		var		$_errors		= array();

		/**
		 * A hack to support __construct() on PHP 4
		 *
		 * Hint: descendant classes have no PHP4 class_name() constructors,
		 * so this constructor gets called first and calls the top-layer __construct()
		 * which (if present) should call parent::__construct()
		 *
		 * @access	public
		 * @return	Object
		 */
		function JObject()
		{
			$args = func_get_args();
			call_user_func_array(array(&$this, '__construct'), $args);
		}

		/**
		 * Class constructor, overridden in descendant classes.
		 *
		 * @access	protected
		 */
		function __construct() {}

		/**
		 * Returns a property of the object or the default value if the property is not set.
		 *
		 * @access	public
		 * @param	string $property The name of the property
		 * @param	mixed  $default The default value
		 * @return	mixed The value of the property
		 * @see		getProperties()
		 */
		function get($property, $default=null)
		{
			if(isset($this->$property)) {
				return $this->$property;
			}
			return $default;
		}

		/**
		 * Returns an associative array of object properties
		 *
		 * @access	public
		 * @param	boolean $public If true, returns only the public properties
		 * @return	array
		 * @see		get()
		 */
		function getProperties( $public = true )
		{
			$vars  = get_object_vars($this);

			if($public)
			{
				foreach ($vars as $key => $value)
				{
					if ('_' == substr($key, 0, 1)) {
						unset($vars[$key]);
					}
				}
			}

			return $vars;
		}

		/**
		 * Get the most recent error message
		 *
		 * @param	integer	$i Option error index
		 * @param	boolean	$toString Indicates if JError objects should return their error message
		 * @return	string	Error message
		 * @access	public
		 */
		function getError($i = null, $toString = true )
		{
			// Find the error
			if ( $i === null) {
				// Default, return the last message
				$error = end($this->_errors);
			}
			else
			if ( ! array_key_exists($i, $this->_errors) ) {
				// If $i has been specified but does not exist, return false
				return false;
			}
			else {
				$error	= $this->_errors[$i];
			}

			// Check if only the string is requested
			if ( JError::isError($error) && $toString ) {
				return $error->toString();
			}

			return $error;
		}

		/**
		 * Return all errors, if any
		 *
		 * @access	public
		 * @return	array	Array of error messages or JErrors
		 */
		function getErrors()
		{
			return $this->_errors;
		}


		/**
		 * Modifies a property of the object, creating it if it does not already exist.
		 *
		 * @access	public
		 * @param	string $property The name of the property
		 * @param	mixed  $value The value of the property to set
		 * @return	mixed Previous value of the property
		 * @see		setProperties()
		 */
		function set( $property, $value = null )
		{
			$previous = isset($this->$property) ? $this->$property : null;
			$this->$property = $value;
			return $previous;
		}

		/**
		* Set the object properties based on a named array/hash
		*
		* @access	protected
		* @param	$array  mixed Either and associative array or another object
		* @return	boolean
		* @see		set()
		*/
		function setProperties( $properties )
		{
			$properties = (array) $properties; //cast to an array

			if (is_array($properties))
			{
				foreach ($properties as $k => $v) {
					$this->$k = $v;
				}

				return true;
			}

			return false;
		}

		/**
		 * Add an error message
		 *
		 * @param	string $error Error message
		 * @access	public
		 */
		function setError($error)
		{
			array_push($this->_errors, $error);
		}

		/**
		 * Object-to-string conversion.
		 * Each class can override it as necessary.
		 *
		 * @access	public
		 * @return	string This name of this class
		 */
		function toString()
		{
			return get_class($this);
		}

		/**
		 * Legacy Method, use {@link JObject::getProperties()}  instead
		 *
		 */
		function getPublicProperties()
		{
			return $this->getProperties();
		}
	}
}